package com.tianlang.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.tianlang.util.CompareColumn;
import com.tianlang.util.SortColumn;

@SuppressWarnings("rawtypes")
public interface IBaseManager {

	/**
	 * 获得指定类型的所有数据 谨慎使用，将会加载整个表的数据
	 * 
	 * @param clazz
	 *            数据类型
	 * @return 结果集
	 */
	public List getObjects(Class clazz);

	/**
	 * 获得单条数据
	 * 
	 * @param clazz
	 *            指定数据类型
	 * @param id
	 *            主键
	 * @return 结果集，未找到结果将获返回空
	 */
	public Object getObject(Class clazz, Serializable id);

	/**
	 * 持久化对象
	 * 
	 * @param o
	 *            需要被持久化的对象
	 */
	public void saveObject(Object o);

	/****
	 * 保存或修改
	 * 
	 * @param o
	 */
	public void updateObject(Object o);

	/****
	 * 删除对象
	 * 
	 * @param clazz
	 *            对象类型
	 * @param id
	 *            对象主键
	 */
	public void removeObject(Class clazz, Serializable id);

	/**
	 * 删除对象
	 * 
	 * @param o
	 *            需要被删除的对象，删除之前先查询出来。
	 */
	public void removeObject(Object o);

	/****
	 * 保存或修改
	 * 
	 * @param entity
	 */
	public void saveOrUpdate(Object entity);

	/****
	 * 执行一段HQL语句，批量删除对象
	 * 
	 * @param hql
	 *            需要被执行的HQL语句
	 */
	public void delete(String hql);

	/******
	 * 获得配置信息<br>
	 * 执行这样一个查询 select scd.paramValue from Sysparam scd where scd.paramKey =:key
	 * 
	 * @param key
	 *            配置名
	 * @return 结果
	 */
	public String getConfigurationValue(String key);

	/**
	 * 统计查询<br>
	 * 查询符合条件的数据条数 ，类似select count(*) where ...<br>
	 * eg: searchMap.put("username","xiaoming");<br>
	 * getTotalSize(User.class,searchMap);<br>
	 * 
	 * @param clz
	 *            查询类型
	 * @param searchMap
	 *            查询条件
	 * @return 符合条件的数据条数
	 */
	public Integer getTotalSize(Class clz, Map<String, Object> searchMap);

	/**
	 * 
	 * <一句话描述功能>查询符合条件的数据条数 ，类似select count(*) where ...</一句话描述功能>
	 * 
	 * @param clz
	 *            查询类型
	 * @param searchMap
	 *            查询条件
	 * @param groupColumn
	 *            分组列
	 * @return 符合条件的数据条数
	 */
	public Integer getTotalSize(Class clz, Map<String, Object> searchMap, String groupColumn);

	/***
	 * 托管修改
	 * 
	 * @param entity
	 *            需要被修改的对象
	 */
	public void saveMerge(Object entity);

	/*****
	 * 分页查询 "本表查询条件"指在HQL中类似"username"这样不涉及别其他关联表的查询条件，
	 * "连接查询条件"指在HQL中类似"address.city"这样中间带点的查询条件，否则方法将不能正常获得查询结果，
	 * 并且对于“连接查询条件”不允许类似“user.address.city”两次连接的写法<br>
	 * CompareColumn 对象包含key,value,dir
	 * 分别为字段名，字段值，计算连接符，"计算连接符"是指字段名与字段值中间的计算符，例如：
	 * "from user where username = 'abc'"中"="为计算连接符，
	 * 计算连接符可以为"eq","ge","gt","le","lt"中的一个， eg:
	 * searchMap.put("username","abc");<br>
	 * searchClassMap.put("address.ctiy","beijin");<br>
	 * compareColumns.put(new CompareColumn("age",CompareColumn.lt,18));<br>
	 * scs.add(new SortColumn("id","desc"));<br>
	 * getPaginationObjects(User.class,searchMap,searchClassMap,compareColumns);
	 * <br>
	 * eg1:对于模糊查询你可以这样，<br>
	 * searchMap.put("username",Constants.LIKE+"abc");<br>
	 * searchClassMap.put("address.ctiy","beijin");<br>
	 * compareColumns.put(new CompareColumn("age",CompareColumn.lt,18));<br>
	 * scs.add(new SortColumn("id","desc"));<br>
	 * getPaginationObjects(User.class,searchMap,searchClassMap,compareColumns);
	 * <br>
	 * 
	 * @param clz
	 *            查询类型
	 * @param pageIndex
	 *            页码
	 * @param pageSize
	 *            每页条数
	 * @param searchMap
	 *            本表查询条件
	 * @param searchClassMap
	 *            连接查询条件
	 * @param compareColumns
	 *            计算连接符查询条件
	 * @param scs
	 *            排序
	 * @return 查询结果集
	 */
	public List getPaginationObjects(Class clz, int pageIndex, int pageSize, Map<String, Object> searchMap,
			Map<String, Object> searchClassMap, List<CompareColumn> compareColumns, List<SortColumn> scs);

	/*****
	 * 分页查询 "本表查询条件"指在HQL中类似"username"这样不涉及别其他关联表的查询条件，
	 * "连接查询条件"指在HQL中类似"address.city"这样中间带点的查询条件，否则方法将不能正常获得查询结果，
	 * 并且对于“连接查询条件”不允许类似“user.address.city”两次连接的写法<br>
	 * eg: searchMap.put("username","abc");<br>
	 * searchClassMap.put("address.ctiy","beijin");<br>
	 * scs.add(new SortColumn("id","desc"));<br>
	 * getPaginationObjects(User.class,searchMap,searchClassMap,compareColumns);
	 * <br>
	 * eg1:对于模糊查询你可以这样，<br>
	 * searchMap.put("username",Constants.LIKE+"abc");<br>
	 * searchClassMap.put("address.ctiy","beijin");<br>
	 * scs.add(new SortColumn("id","desc"));<br>
	 * getPaginationObjects(User.class,searchMap,searchClassMap,compareColumns);
	 * <br>
	 * 
	 * @param clz
	 *            查询类型
	 * @param pageIndex
	 *            页码
	 * @param pageSize
	 *            每页条数
	 * @param searchMap
	 *            本表查询条件
	 * @param searchClassMap
	 *            连接查询条件
	 * @param scs
	 *            排序
	 * @return 查询结果集
	 */
	public List<Object> getPaginationObjects(Class clz, final int pageIndex, final int pageSize,
			Map<String, Object> searchMap, Map<String, Object> searchClassMap, List<SortColumn> scs);

	public List<Object> getPaginationObjectsByGroup(Class clz, final int pageIndex, final int pageSize,
			Map<String, Object> searchMap, Map<String, Object> searchClassMap, List<SortColumn> scs,
			String groupColumn);

	/*****
	 * 条件查询 * 谨慎使用，注意限制结果集大小<br>
	 * "本表查询条件"指在HQL中类似"username"这样不涉及别其他关联表的查询条件， eg:
	 * searchMap.put("username","abc");<br>
	 * scs.add(new SortColumn("id","desc"));<br>
	 * getPaginationObjects(User.class,searchMap,searchClassMap,compareColumns);
	 * <br>
	 * eg1:对于模糊查询你可以这样，<br>
	 * searchMap.put("username",Constants.LIKE+"abc");<br>
	 * scs.add(new SortColumn("id","desc"));<br>
	 * getPaginationObjects(User.class,searchMap,searchClassMap,compareColumns);
	 * <br>
	 * 
	 * @param clz
	 *            查询类型
	 * @param searchMap
	 *            本表查询条件
	 * @param scs
	 *            排序
	 * @return 查询结果集
	 */
	public List getObjectsByParams(Class clz, Map<String, Object> searchMap, List<SortColumn> scs);

	public List getObjectsByParams(Class clz, Map<String, Object> searchMap, Map<String, Object> searchClassMap,
			List<SortColumn> scs);

	/*****
	 * 条件查询查询 谨慎使用，注意限制结果集大小<br>
	 * "本表查询条件"指在HQL中类似"username"这样不涉及别其他关联表的查询条件，
	 * "连接查询条件"指在HQL中类似"address.city"这样中间带点的查询条件，否则方法将不能正常获得查询结果，
	 * 并且对于“连接查询条件”不允许类似“user.address.city”两次连接的写法<br>
	 * 只会返回记过集的第一个对象，如果结果集不为空的话 eg: searchMap.put("username","abc");<br>
	 * getPaginationObjects(User.class,searchMap);<br>
	 * eg1:对于模糊查询你可以这样，<br>
	 * searchMap.put("username",Constants.LIKE+"abc");<br>
	 * getPaginationObjects(User.class,searchMap);<br>
	 * 
	 * @param clz
	 *            查询类型
	 * @param searchMap
	 *            本表查询条件
	 * @return 查询结果集第一个对象
	 */

	public Object getObjectByParams(Class clz, Map<String, Object> searchMap);

	/*****
	 * 统计查询<br>
	 * "本表查询条件"指在HQL中类似"username"这样不涉及别其他关联表的查询条件，<br>
	 * "连接查询条件"指在HQL中类似"address.city"这样中间带点的查询条件，否则方法将不能正常获得查询结果，<br>
	 * 并且对于“连接查询条件”不允许类似“user.address.city”两次连接的写法<br>
	 * CompareColumn 对象包含key,value,dir
	 * 分别为字段名，字段值，计算连接符，"计算连接符"是指字段名与字段值中间的计算符，例如：
	 * "from user where username = 'abc'"中"="为计算连接符，
	 * 计算连接符可以为"eq","ge","gt","le","lt"中的一个，<br>
	 * eg: searchMap.put("username","abc");<br>
	 * searchClassMap.put("address.ctiy","beijin");<br>
	 * compareColumns.put(new CompareColumn("age",CompareColumn.lt,18));<br>
	 * getPaginationObjects(User.class,searchMap,searchClassMap,compareColumns);
	 * <br>
	 * eg1:对于模糊查询你可以这样， searchMap.put("username",Constants.LIKE+"abc");<br>
	 * searchClassMap.put("address.ctiy","beijin");<br>
	 * compareColumns.put(new CompareColumn("age",CompareColumn.lt,18));<br>
	 * getPaginationObjects(User.class,searchMap,searchClassMap,compareColumns);
	 * <br>
	 * 
	 * @param clz
	 *            查询类型
	 * @param searchMap
	 *            本表查询条件
	 * @param searchClassMap
	 *            连接查询条件
	 * @param compareColumns
	 *            计算连接符查询条件
	 * @return 查询结果集数量
	 */
	public Integer getPaginationObjects(Class clz, Map<String, Object> searchMap, Map<String, Object> searchClassMap,
			List<CompareColumn> compareColumns);

	/*****
	 * 统计查询
	 * 
	 * "本表查询条件"指在HQL中类似"username"这样不涉及别其他关联表的查询条件，
	 * "连接查询条件"指在HQL中类似"address.city"这样中间带点的查询条件，否则方法将不能正常获得查询结果，
	 * 并且对于“连接查询条件”不允许类似“user.address.city”两次连接的写法<br>
	 * eg: searchMap.put("username","abc");<br>
	 * searchClassMap.put("address.ctiy","beijin");<br>
	 * getPaginationObjects(User.class,searchMap,searchClassMap);<br>
	 * eg1:对于模糊查询你可以这样，<br>
	 * searchMap.put("username",Constants.LIKE+"abc");<br>
	 * searchClassMap.put("address.ctiy","beijin");<br>
	 * getPaginationObjects(User.class,searchMap,searchClassMap);<br>
	 * 
	 * @param clz
	 *            查询类型
	 * @param searchMap
	 *            本表查询条件
	 * @param searchClassMap
	 *            连接查询条件
	 * @return 查询结果集数量
	 */
	public Integer getPaginationObjects(Class clz, Map<String, Object> searchMap, Map<String, Object> searchClassMap);

	public <E> List<E> getListByWhere(String where, Object[] objects, Integer start, Integer size);

	public Integer getCount(String where, Object[] values);

}
